/**
 * 错误信息翻译表
 *
 * @fileoverview 将技术错误信息翻译为用户友好的中文消息和处理建议
 */

export interface ErrorTranslation {
  /** 用户友好的错误消息 */
  message: string
  /** 处理建议 */
  suggestion: string
}

/**
 * 错误类型到用户友好消息的映射
 */
export const ERROR_TRANSLATIONS: Record<string, ErrorTranslation> = {
  // 网络相关错误
  'NetworkError': {
    message: '网络连接失败',
    suggestion: '请检查您的网络连接，或稍后重试。如果问题持续，请联系技术支持',
  },
  'ETIMEDOUT': {
    message: '网络连接超时',
    suggestion: '服务器响应较慢，可能是网络不稳定。请稍后重试',
  },
  'ECONNRESET': {
    message: '网络连接被重置',
    suggestion: '网络连接中断，请检查网络后重试',
  },
  'ENOTFOUND': {
    message: '无法连接到服务器',
    suggestion: 'DNS解析失败，请检查网络连接或稍后重试',
  },
  'TimeoutError': {
    message: '操作超时',
    suggestion: '服务器响应较慢，请稍后重试。如果问题持续，请联系技术支持',
  },

  // 预约相关错误
  'NoAvailableDate': {
    message: '当前没有可用的预约日期',
    suggestion: '系统会继续监控，一旦有新的可预约日期会自动尝试',
  },
  '没有可用.*日期': {
    message: '当前没有可用的预约日期',
    suggestion: '系统会继续监控，一旦有新的可预约日期会自动尝试',
  },
  '无可用日期': {
    message: '当前没有可用的预约日期',
    suggestion: '系统会继续监控，一旦有新的可预约日期会自动尝试',
  },
  'FormValidationError': {
    message: '表单信息验证失败',
    suggestion: '请检查填写的预约信息是否正确完整',
  },
  'AlreadyBooked': {
    message: '该服务类型已有预约',
    suggestion: '您已经有一个同类型的预约，无法重复预约',
  },
  '512-E-0001': {
    message: '该服务类型已有预约',
    suggestion: '您已经有一个同类型的预约，无法重复预约',
  },
  '已存在同服务类型的预约': {
    message: '该服务类型已有预约',
    suggestion: '您已经有一个同类型的预约，无法重复预约',
  },

  // 浏览器相关错误
  'BrowserError': {
    message: '浏览器操作失败',
    suggestion: '浏览器可能出现异常，系统将自动重试',
  },
  'PageLoadError': {
    message: '页面加载失败',
    suggestion: '页面加载超时或失败，系统将自动重试',
  },
  'ElementNotFound': {
    message: '页面元素未找到',
    suggestion: '页面结构可能已变更，系统将自动重试',
  },

  // 系统错误
  'SystemError': {
    message: '系统错误',
    suggestion: '发生了系统错误，请稍后重试或联系技术支持',
  },
  'DatabaseError': {
    message: '数据库操作失败',
    suggestion: '数据保存失败，请稍后重试',
  },
}

/**
 * 翻译错误为用户友好消息
 *
 * @param error - 错误对象或错误消息
 * @param context - 错误发生的上下文（可选）
 * @returns 翻译后的错误信息和建议
 */
export function translateError(
  error: Error | string,
  context?: string,
): ErrorTranslation {
  const errorMessage = typeof error === 'string' ? error : error.message
  const errorName = typeof error === 'string' ? error : error.name

  // 尝试匹配错误消息中的关键词
  for (const [pattern, translation] of Object.entries(ERROR_TRANSLATIONS)) {
    // 如果是正则表达式模式（以/开头和结尾）
    if (pattern.startsWith('/') && pattern.endsWith('/')) {
      const regex = new RegExp(pattern.slice(1, -1), 'i')
      if (regex.test(errorMessage)) {
        return translation
      }
    }
    // 精确匹配
    else if (errorMessage.includes(pattern) || errorName === pattern) {
      return translation
    }
  }

  // 默认翻译
  return {
    message: `操作失败: ${errorMessage}`,
    suggestion: context
      ? `在${context}时发生错误，请稍后重试或联系技术支持`
      : '请稍后重试，如果问题持续，请联系技术支持',
  }
}
